package com.medic.service.interf;

import java.util.List;

import com.github.pagehelper.Page;
import com.medic.entity.group.pain.Compliance;
import com.medic.entity.group.pain.Health;
import com.medic.entity.group.pain.Pain;
import com.medic.entity.group.pain.Reaction;
import com.medic.entity.group.pain.SikerInfo;
import com.medic.entity.group.pain.TakeRecord;
import com.medic.entity.group.pain.Task;
import com.medic.entity.group.pain.TitrRecord;

public interface TaskServiceInterface extends ServiceInterface<Task> {

	/**
	 * 批量添加
	 * 
	 * @param tasks
	 *            任务的list集合
	 * @return 成功条数
	 * @throws Exception
	 */
	public int saveBatch(List<Task> tasks) throws Exception;

	/**
	 * 患者完成任务
	 * 
	 * @param tsId
	 *            任务id
	 * @param sikerId
	 *            患者id
	 * @return 成功返回true
	 * @throws Exception
	 */
	public boolean finsh(long tsId, int sikerId) throws Exception;

	/**
	 * 判断用户和任务是否一致
	 * 
	 * @param tsId
	 *            任务id
	 * @param sikerId
	 *            患者id
	 * @return groupId
	 * @throws Exception
	 */
	public int judge(long tsId, int sikerId) throws Exception;

	/**
	 * 医生、药师、助手批阅
	 * 
	 * @param status
	 *            医生、药师、助手各自对应的code
	 * @param tsId
	 *            任务id
	 * @return 成功返回true
	 * @throws Exception
	 */
	public boolean checkup(int status, long tsId) throws Exception;

	/**
	 * 更新滴定过程中的过期时间
	 * 
	 * @param crDate
	 *            过期时间
	 * @param tsId
	 *            任务id
	 * @return 成功放回true
	 * @throws Exception
	 */
	public boolean updateTitrCrDate(long crDate, long tsId) throws Exception;

	/**
	 * 患者分页查询（不需要患者姓名）
	 * 
	 * @param current
	 *            当前页
	 * @param sikerId
	 *            患者id
	 * @param groupId
	 *            组id
	 * @param status
	 *            状态 2已完成 1未完成过期 0未完成未过期（在数据库中未完成的都是1，而过期与否用crDate来进行判断）
	 * @param crDate
	 *            当前时间毫秒数，如果是已经完成任务，传值0即可，查询未完成的任务，判断过期需要用到，所以必须。
	 * @return task的page集合
	 * @throws Exception
	 */
	public Page<Task> getByPageUser(int current, int sikerId, int groupId, int status, long crDate) throws Exception;

	/**
	 * 医生分页查询（需要用户名字）
	 * 
	 * @param current
	 *            当前页
	 * @param groupId
	 *            组id
	 * @param status
	 *            状态 3 已批阅 2未批阅 1未完成过期 0未完成未过期（在数据库中未完成的都是1，而过期与否用crDate来进行判断）
	 * @param crDate当前时间毫秒数，如果是已经完成任务，传值0即可，查询未完成的任务，判断过期需要用到，所以必须。
	 * @return task的page集合
	 * @throws Exception
	 */
	public Page<Task> getByPageDoctor(int current, int groupId, int status, long crDate) throws Exception;

	/**
	 * 助手分页查询（需要用户名字）
	 * 
	 * @param current
	 *            当前页
	 * @param groupId
	 *            组id
	 * @param status
	 *            状态 3 已批阅 2未批阅 1未完成过期 0未完成未过期（在数据库中未完成的都是1，而过期与否用crDate来进行判断）
	 * @param crDate当前时间毫秒数，如果是已经完成任务，传值0即可，查询未完成的任务，判断过期需要用到，所以必须。
	 * @return task的page集合
	 * @throws Exception
	 */
	public Page<Task> getByPageAssitant(int current, int groupId, int status, long crDate) throws Exception;

	/**
	 * 药师分页查询（需要用户名字）
	 * 
	 * @param current
	 *            当前页
	 * @param groupId
	 *            组id
	 * @param status
	 *            状态 3 已批阅 2未批阅 1未完成过期 0未完成未过期（在数据库中未完成的都是1，而过期与否用crDate来进行判断）
	 * @param crDate当前时间毫秒数，如果是已经完成任务，传值0即可，查询未完成的任务，判断过期需要用到，所以必须。
	 * @return task的page集合
	 * @throws Exception
	 */
	public Page<Task> getByPagePharmacist(int current, int groupId, int status, long crDate) throws Exception;

	/**
	 * 通过id查询
	 * 
	 * @param tsId
	 *            任务id
	 * @return 任务对象
	 * @throws Exception
	 */
	public Task getById(long tsId) throws Exception;

	/**
	 * 添加依从性反馈
	 * 
	 * @param compliance
	 *            依从性反馈对象，注意该对象的tsId必须赋值为其所属任务的id。
	 * @return 成功返回true
	 * @throws Exception
	 */
	public boolean saveCompliance(Compliance compliance) throws Exception;

	/**
	 * 根据任务id获取依从性反馈的详细信息（tsId添加了唯一索引）
	 * 
	 * @param tsId
	 *            任务id
	 * @return 依从性
	 * @throws Exception
	 */
	public Compliance getComplianceByTsId(long tsId) throws Exception;

	/**
	 * 添加健康反馈
	 * 
	 * @param hls
	 *            健康反馈问题大难键值对列表，list集合中的每个对象中必须要有tsId
	 * @return 成功条数
	 * @throws Exception
	 */
	public int saveHealth(List<Health> hls) throws Exception;

	/**
	 * 根据任务id查找
	 * 
	 * @param id
	 *            任务id
	 * @return list集合
	 * @throws Exception
	 */
	public List<Health> getHealthByTsId(long id) throws Exception;

	/**
	 * 添加疼痛反馈（需要先添加疼痛性质）
	 * 
	 * @param pain
	 *            对象，注意该对象的tsId必须赋值为其所属任务的id，以及疼痛性质的id。
	 * @return 成功返回true
	 * @throws Exception
	 */
	public boolean savePain(Pain pain) throws Exception;

	/**
	 * 通过任务id或者painId查询，用于详细信息展示（利用tsId时，疼痛反馈不能是滴定任务中的）
	 * 
	 * @param tsId
	 *            任务id
	 * @param painId
	 *            疼痛反馈id
	 * @return 疼痛反馈对象
	 * @throws Exception
	 */
	public Pain getPainByTsIdOrId(long tsId, int painId) throws Exception;

	/**
	 * 添加不良反应反馈
	 * 
	 * @param reaction
	 *            不良反应反馈对象，注意该对象的tsId必须赋值为其所属任务的id
	 * @return 成功返回true
	 * @throws Exception
	 */
	public boolean saveReaction(Reaction reaction) throws Exception;

	/**
	 * 通过任务id查找
	 * 
	 * @param tsId
	 *            任务id
	 * @return 不良反应反馈对象
	 * @throws Exception
	 */
	public Reaction getReactionByTsId(long tsId) throws Exception;

	/**
	 * 添加滴定记录
	 * 
	 * @param titr
	 *            滴定过程记录
	 * @return 成功返回true
	 * @throws Exception
	 */
	public boolean saveTitrRecord(TitrRecord titr) throws Exception;

	/**
	 * 通过任务id查找滴定记录列表
	 * 
	 * @param tsId
	 *            任务id
	 * @return list集合
	 * @throws Exception
	 */
	public List<TitrRecord> getTitrRecordByTsId(long tsId) throws Exception;

	/**
	 * 确认滴定过程中的服药
	 * 
	 * @param titrId
	 *            滴定记录id
	 * @return 成功返回true
	 * @throws Exception
	 */
	public boolean sureTake(long titrId) throws Exception;

	/**
	 * 在疼痛评估完成后，更新滴定记录中的疼痛评估相关信息
	 * 
	 * @param titrId
	 *            滴定记录id
	 * @param painId
	 *            疼痛评估id
	 * @param crDate
	 *            评估完成时间
	 * @param painLevel
	 *            疼痛等级
	 * @return 成功返回true
	 * @throws Exception
	 */
	public boolean updateTitrRecord(long titrId, int painId, int painLevel) throws Exception;

	/**
	 * 添加服药提醒的服药记录
	 * 
	 * @param takeRecord
	 *            服药记录
	 * @return 成功返回true
	 * @throws Exception
	 */
	public boolean saveTakeRecord(TakeRecord takeRecord) throws Exception;

	/**
	 * 根据任务id查找服药记录
	 * 
	 * @param tsId
	 *            任务id
	 * @return 服药记录
	 * @throws Exception
	 */
	public TakeRecord getTakeRecordByTsId(long tsId) throws Exception;

	/**
	 * 查询出所有未完成的任务未过期
	 * 
	 * @param nowDate
	 *            当前时间
	 * @return list集合
	 * @throws Exception
	 */
	public List<Task> getUndo(long nowDate) throws Exception;

	/**
	 * 查询患者当前滴定任务的id
	 * 
	 * @param sikerId
	 *            患者的id
	 * @return 任务id
	 * @throws Exception
	 */
	public long getTitrTask(int sikerId) throws Exception;

	/**
	 * 根据当前入组信息添加滴定的服药任务
	 * 
	 * @param info
	 *            入组信息
	 * @param amounts
	 *            上一次服用的剂量（如果是首次则0即可）
	 * @return 返回成功添加的对象,不成功返回null
	 * @throws Exception
	 */
	public TitrRecord saveTitrRecord(SikerInfo info, double amounts) throws Exception;

	/**
	 * 获取患者在组里某种任务的总数目
	 * 
	 * @param sikerId
	 *            患者id
	 * @param groupId
	 *            组id
	 * @param tsType
	 *            任务类型（如果是0则是所有任务）
	 * @return 总数目
	 * @throws Exception
	 */
	public int getTaskNum(int sikerId, int groupId, int tsType) throws Exception;

}